#ifndef DATACOLLECTOR_H
#define DATACOLLECTOR_H

#include <iostream>
#include <vector>
#include <map>
#include <thread>
#include <mutex>
#include <atomic>
#include <chrono>
#include <memory>
#include <string>
#include <functional>
#include "SecurityAuditor.h"

// 测点数据结构
struct PointData {
    std::string id;          // 测点ID
    std::string name;        // 测点名称
    float value;             // 测量值
    std::string unit;        // 单位
    std::chrono::system_clock::time_point timestamp; // 时间戳
    bool is_alarm;           // 是否告警
    float upper_limit;       // 上限阈值
    float lower_limit;       // 下限阈值

    PointData() : value(0), is_alarm(false), upper_limit(0), lower_limit(0) {}
    PointData(const std::string& i, const std::string& n, const std::string& u, float ul, float ll)
        : id(i), name(n), unit(u), upper_limit(ul), lower_limit(ll), value(0), is_alarm(false) {}
};

// 协议处理基类
class ProtocolHandler {
public:
    virtual ~ProtocolHandler() = default;
    virtual bool connect(const std::string& config) = 0;
    virtual void disconnect() = 0;
    virtual std::vector<PointData> readData() = 0;
    virtual std::string getProtocolName() const = 0;
};

// 数据采集器主类
class DataCollector {
private:
    std::vector<std::unique_ptr<ProtocolHandler>> handlers;
    std::map<std::string, PointData> pointDatabase;
    std::thread collectionThread;
    std::atomic<bool> isRunning;
    std::mutex dataMutex;
    std::chrono::milliseconds collectionInterval;
    size_t totalPoints;
    std::function<void(const std::vector<PointData>&)> dataCallback;
    std::unique_ptr<SecurityAuditor> securityAuditor;

    // 数据采集线程函数
    void collectDataLoop();

    // 检查是否超过阈值并设置告警
    void checkAlarmThresholds(PointData& point);

public:
    // 构造函数与析构函数
    DataCollector(std::chrono::milliseconds interval = std::chrono::milliseconds(100));
    ~DataCollector();

    // 添加协议处理器
    bool addProtocolHandler(std::unique_ptr<ProtocolHandler> handler);

    // 启动/停止采集
    bool startCollection();
    void stopCollection();

    // 设置数据回调函数
    void setDataCallback(std::function<void(const std::vector<PointData>&)> callback);

    // 获取当前所有测点数据
    std::vector<PointData> getAllPoints();

    // 获取采集器状态信息
    std::string getStatusInfo() const;

    // 获取总测点数
    size_t getTotalPoints() const { return totalPoints; }
};

#endif // DATACOLLECTOR_H